<?php
class Base extends CActiveRecord {
    /**
     * 获取分页数据
     * @param $page int 当前页码
     * @param $limit int 每个显示个数
     * @param $type string 资源类型
     * @return mixed 分页结果
     */
    public function getPageList($page = 1, $limit = 10,$name="") {
        $page = intval($page);
        $limit = intval($limit);
        $criteria = new CDbCriteria();   //查询对象

        $this->pageListCondition($criteria);  //设置查询对象条件

        $count = intval($this->count($criteria));  //获取总记录数

        $this->pageListOpt($criteria);  //排序，分组等其他操作

        $total_page = ceil($count / $limit);  //总页数

        $offset = ($page - 1) * $limit;  //偏移量

        $criteria->limit = $limit; //取10条数据，如果小于0，则不作处理
        $criteria->offset = $offset; //两条合并起来，则表示 limit 10 offset 1,或者代表了。limit 1,10
        if($name){
            $criteria->addCondition("name like '%{$name}%'");
        }
        $data_obj = $this->findAll($criteria);  //取出所有模型
        $data_list = $this->objToData($data_obj);  //将模型转换成数组数据
        return array(
            'code' => 0,
            'mes' => '查询成功',
            'page' => $page,
            'total_page' => $total_page,
            'count' => $count,
            'data' => $data_list,
        );
    }

    /**
     * 将模型对象转换成数组
     * @param $data_obj 模型对象数组
     * @return array 数组数据
    */
    protected function objToData($data_obj) {
        $relation = array();
        if (method_exists($this, 'relations')) {
            $relation = $this->relations();
            if (empty($relation) || !is_array($relation)) {
                $relation = array();
            }
        }

        $data_list = array();
        //先将当前模型的数据转换，然后转换关联模型
        foreach ($data_obj as $obj) {
            $data = $obj->getAttributes();  //转换当前模型数据
            foreach ($relation as $k => $v) {
                //转换关联模型数据，并追加到当前模型中
                if (isset($v['select'])) {
                    //如果定义了字段，就取关联模型的这些字段
                    $fields = explode(',', $v['select']);
                    foreach ($fields as $field) {
                        $data[$field] = $obj->$k->$field;
                    }
                } else {
                    //反之取关联模型的所有字段
                    $data = array_merge($obj->$k->getAttributes(), $data);
                }
            }
            $data_list[] = $data;
        }
        return $data_list;
    }

    public function getErrors($attribute = null) {
        $errors = parent::getErrors($attribute);
        $err_arr = array();
        foreach ($errors as $er) {
            $err_arr[] = current($er);
        }
        return join('<br>', $err_arr);
    }

    /**
     * 重写父类delete方法，用try  catch包起来
     * @return bool 删除成功/失败
    */
    public function delete() {
        try {
            return parent::delete(); // TODO: Change the autogenerated stub
        } catch (CDbException $e) {
            $this->addError('delete', $e->getMessage());
            return false;
        }
    }

    /**
     * 设置分页的查询条件(依赖注入的形式来改变$criteriad对象属性)
     * @param $criteria CDbCriteria $criteriad查询对象
     * @return null
    */
    protected function pageListCondition(CDbCriteria $criteria) {}

    /**
     * 设置分页的其他操作，排序，分类，等操作(依赖注入的形式来改变$criteriad对象属性)
     * @param $criteria CDbCriteria $criteriad查询对象
     * @return null
     */
    protected function pageListOpt(CDbCriteria $criteria) {
        $criteria->select = '*';
        $criteria->order = 'id desc';
    }
}